Http缓存

304: not Modified
302 Found 重定向状态码

本地存储解决方案很多,比如Flash SharedObject、Google Gears、Cookie、DOM Storage、User Data、window.name、Silverlight、Open Database等。

# [HTTP 缓存机制一二三]:
Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。
浏览器缓存也包含很多内容: HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。

http缓存

Vary: User-Agent, Accept-Encoding

强制缓存:
param,http1.0 值:no-cache
<meta http-equiv="Pragma" content="no-cache">
仅有IE才能识别这段meta标签含义
在IE中识别到该meta标签含义,并不一定会在请求字段加上Pragma,但的确会让当前页面每次都发新请求(仅限页面,页面上的资源则不受影响)。

expires,http1.0
cache-control, http1.1/优先级高,通用头

cache-control:max-age=\;s-maxage=\
public/private, no-chche, no-store,no-transform
only-if-cached,must-revalidate,proxy-revalidate,
cache-extension

协商缓存:
res/req
Last-Modified / If-Modified-Since
Etag / If-None-Match

Pragma

Pragma有两个字段Pragma和Expires。Pragma的值为no-cache时,表示禁用缓存,Expires的值是一个GMT时间,表示该缓存的有效时间。
Pragma是旧产物,已经逐步抛弃,有些网站为了向下兼容还保留了这两个字段。如果一个报文中同时出现Pragma和Cache-Control时,以Pragma为准。同时出现Cache-Control和Expires时,以Cache-Control为准。即优先级从高到低是 Pragma -> Cache-Control -> Expires

cache-control 值

在请求中使用Cache-Control 时,它可选的值有:
在响应中使用Cache-Control 时,它可选的值有:

public和private的选择
如果你用了CDN,你需要关注下这个值。CDN厂商一般会要求cache-control的值为public,提升缓存命中率。
如果你的缓存命中率很低,而访问量很大的话,可以看下是不是设置了private,no-cache这类的值。如果定义了max-age,可以不用再定义public,它们的意义是一样的。

# [浏览器缓存机制剖析]

vary date age等

vary: 对于服务器而言, 资源文件可能不止一个版本, 比如说压缩和未压缩, 针对不同的客户端, 通常需要返回不同的资源版本. 比如说老式的浏览器可能不支持解压缩
Vary:Accept-Encoding,User-Agent
Age:2383321 :表示命中代理服务器的缓存. 它指的是代理服务器对于请求资源的已缓存时间,
Date:Wed, 08 Mar 2017 16:12:42 GMT :响应生成的时间. 请求经过代理服务器时, 返回的Date未必是最新的, 通常这个时候, 代理服务器将增加一个Age字段告知该资源已缓存了多久.

其它:[浅谈浏览器http的缓存机制]

怎么让浏览器不缓存静态资源

<link rel="stylesheet" type="text/css" href="../css/style.css?version=1.8.9"/>

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
上述虽能禁用缓存, 但只有部分浏览器支持, 而且由于代理不解析HTML文档, 故代理服务器也不支持这种方式.

F5/刷新,强制刷新

# [如何用 HTTP Caching 优化网站] 0043-D
Last-Modified 与 Etag 头(即是方式1和2)还是要请求服务器的,只是仅返回 304 头,不返回内容。所以浏览怎么 F5 ,304 都是有效的。

Expires 头与 max-age 缓存是不需要请求服务器的,直接从本地缓存中取。但 F5 会忽视缓存(所以使用 httpwatch 之类的 http 协议监察工具时,不要 F5 误认为 Expires 和 max-age 是无效的)。

强制刷新(Ctrl+F5)

但用 Ctrl+F5 是全新请求的(这是浏览器行为,不发送缓存相关的头)。
效果和无缓存时候一致,返回200的结果

普通页面跳转

普通页面跳转包括链接点击跳转,用js脚本打开新页面(window.open)

无缓存情况下,请求会返回所有资源结果
设置Expires并且未过期时,浏览器将不会发出http请求
如果Expires过期,则会发送相应请求,并附带上Last-Modifed等信息,供服务器校验

# [彻底理解浏览器的缓存机制] 004-D

内存缓存和硬盘缓存

对于这个问题,我们需要了解内存缓存(from memory cache)和硬盘缓存(from disk cache),如下:

内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:

快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。

时效性:一旦该进程关闭,则该进程的内存则会清空。

硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。

knowledge is no pay,reward is kindness
0%